/*
假定有一个无限长的数轴，数轴上每个坐标的数据都是0，
现在需要进行n次操作，每次操作将某一位置x上的数加c
接下来进行m次询问,每次询问包含两个整数l，r，你需要求出在区间[l,r]之间所有数的和。
−1e9≤x≤1e9
1≤n,m≤1e5
−1e9≤l≤r≤1e9
−10000≤c≤10000
*/
#include <bits/stdc++.h>
using namespace std;

using PII = pair<int, int>;
const int N = 300000 + 10;  // n + 2*m 的最大值
int a[N]; //离散化后的数组
int s[N]; //前缀和数组
vector<int> alls; // 存储左右需要离散化的坐标
vector<PII> add, query; // 存储添加操作、存储查询操作

// 二分查找（找第一个 >=x 的位置）：将坐标x映射到1-based索引
int find(int x) {
    int l = 0, r = alls.size() - 1;
    while (l < r) {
        int mid = l + (r - l) / 2;  // 防溢出
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    } // 退出循环时 l == r
    return l + 1;  // 映射到1,2,3...方便前缀和计算
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int n, m; cin >> n >> m;
    // 读取添加操作
    for (int i = 0; i < n; i++) {
        int x, c;
        cin >> x >> c;
        add.push_back({x, c}); // 在x位置的坐标上加c
        alls.push_back(x);
    }
    // 读取查询
    for (int i = 0; i < m; i++) {
        int l, r;
        cin >> l >> r;
        query.push_back({l, r});
        alls.push_back(l); alls.push_back(r);
    }
    // 离散化：排序去重
    sort(alls.begin(), alls.end());
    alls.erase(unique(alls.begin(), alls.end()), alls.end());
    // 处理添加操作
    for (auto& item : add) {
        int id = find(item.first);
        a[id] += item.second;
    }
    // 构建前缀和
    for (int i = 1; i <= alls.size(); i++) {
        s[i] = s[i - 1] + a[i];
    }
    // 处理查询
    for (auto& item : query) {
        int l = find(item.first), r = find(item.second);
        cout << s[r] - s[l - 1] << endl;
    }
    return 0;
}
